package mine.code.question.数组;

import org.junit.Test;

import java.util.Arrays;

/**
 * 给你一份『词汇表』（字符串数组） words 和一张『字母表』（字符串） chars。
 * <p>
 * 假如你可以用 chars 中的『字母』（字符）拼写出 words 中的某个『单词』（字符串），那么我们就认为你掌握了这个单词。
 * <p>
 * 注意：每次拼写时，chars 中的每个字母都只能用一次。
 * <p>
 * 返回词汇表 words 中你掌握的所有单词的 长度之和。
 * <p>
 *  
 * <p>
 * 示例 1：
 * <p>
 * 输入：words = ["cat","bt","hat","tree"], chars = "atach"
 * 输出：6
 * 解释：
 * 可以形成字符串 "cat" 和 "hat"，所以答案是 3 + 3 = 6。
 * <p>
 * ps:
 * 1 <= words.length <= 1000
 * 1 <= words[i].length, chars.length <= 100
 * 所有字符串中都仅包含小写英文字母
 *
 * @author caijinnan
 * @date 2020/3/17 15:55
 */
public class 拼写单词 {
    @Test
    public void run() {
        String[] words = {"hello", "world", "leetcode"};
        String chars = "welldonehoneyr";
        System.out.println(countCharacters(words, chars));
    }

    public int countCharacters(String[] words, String chars) {
        //定义字母表作为哈希表,记录字母出现次数
        int[] wordNumArr = new int[26];
        for (int i = 0, length = chars.length(); i < length; i++) {
            char charTemp = chars.charAt(i);
            //统计次数
            wordNumArr[charTemp - 97]++;
        }
        int resultNum = 0;
        outside:
        for (String strTemp : words) {
            //复制一份数组,作为比较参数
            int[] compareArr = Arrays.copyOfRange(wordNumArr, 0, wordNumArr.length);
            for (int i = 0, length = strTemp.length(); i < length; i++) {
                char charTemp = strTemp.charAt(i);
                if (compareArr[charTemp - 97] == 0) {
                    continue outside;
                } else {
                    compareArr[charTemp - 97]--;
                }
            }
            resultNum += strTemp.length();
        }

        return resultNum;
    }
}